类型转换总结列表
值 |
字符串 |
数字 |
布尔值 |
对象 |
undefined |
“undefined” |
NaN |
false |
throwTypeError |
null |
“null” |
0 |
false |
throwTypeError |
true |
“true” |
1 |
|
newBoolean(true) |
false |
“false” |
0 |
|
newBoolean(false) |
“”(空字符串) |
|
0 |
false |
newString(“”) |
“1.2”(非空,数字,允许首尾带有空格) |
|
1.2 |
true |
newString(“1.2”) |
“one”(非空,非数字) |
|
NaN |
true |
newString(“one”) |
0 |
“0” |
|
false |
newNumber(0) |
-0 |
“0” |
|
false |
newNumber(-0) |
NaN |
“NaN” |
|
false |
newNumber(NaN) |
Infinity |
“Infinity” |
|
true |
newNumber(Infinity) |
-Infinity |
“-Infinity” |
|
true |
newNumber(-Infinity) |
1(非无穷大,非零) |
“1” |
|
true |
newNumber(1) |
{}(任意对象) |
详见下方 |
详见下方 |
true |
|
[](任意数组) |
“” |
0 |
true |
|
[9](1 个数字元素) |
“9” |
9 |
true |
|
[‘a’](其他数组) |
使用join() 方法(默认用逗号连接) |
NaN |
true |
|
function(){}(任意函数) |
调用toString() 方法,通常是转换成源代码字符串 |
NaN |
true |
对象如何转换成字符串或数字
toString()
方法:
- 调用
toString()
方法,一般是返回"[object object]"
:1
| ;({ x: 1, y: 2 }.toString())
|
- 数组是调用
join()
方法:
- 函数则是转换成源代码字符串
1 2 3
| ;(function (x) { f(x) }.toString())
|
- Date 类型会返回一个可读的日期和时间字符串:
1
| new Date(2010, 0, 1).toString()
|
- RegExp 类则是转换成正则表达式字符串
valueOf()
方法:
- 如果对象存在任意原始值,默认将对象转换成它的原始值(比如各种原始对象的包装对象)
- 一般,都是简单的返回对象本身
- 特殊的是:Date类型,日期类的
valueOf()
会返回一个内部表示:从 1970 年 1 月 1 日以来的毫秒数:
1 2
| var d = new Date(2010, 0, 1) d.valueOf()
|
对象到字符串的转换步骤:
对象到数字的过程:基本上和上面一致,只不过会先调用valueOf()
的方法。
转换和相等性
- 用
==
作比较时,为了保持两端的类型一致,会做一些类型转换
- 用
===
作比较时,并不会做任何类型转换
- 在做转换的时候,一个值能转换成另一个值,并不意味着这两个值相等
===
和==
===
严格相等
- 不相等的情况:
- 两个值类型不同
- 其中一个值为
NaN
或者两个都为NaN
(需要强调:NaN
和任何值都不相等,包括其本身。可以用x!==x
来判断 x 是否为NaN
)。
- 相等的情况
- 都是
null
或者都是undefined
- 两个值为数字,且数值相等(包括 0 和-0 的情况)
- 两个值都为布尔值,且都是
true
或false
- 两个值都是字符串,且它们长度一致,对应位上的值都相等
- 两个值都是引用值,且他们指向同一个对象。数组或函数
==
相等
- 两个值类型相同,和严格相等的比较规则一样,即它们严格相等时,才会想等。
- 两个值类型不同:
- 一个是
null
,一个是undefined
,认为其相等
- 如果一个值是数字,一个是字符串,则会先将字符串转换成数字,然后用转换后的值进行比较
- 如果一个值是
true
,则将其转换成 1 再比较;如果是false
,则将其转换成 0
- 对象和数字或字符串的比较,遵循上文的规则将对象转换成原始值再进行比较(除了日期类以外,都是先用
valueOf()
再用toString()
)
- 小例子:
"1" == true
,答案是相等的,分成两步:一是将true
转换成1
;而是将"1"
转换成1
。
显式类型转换
- 除了
null
和undefined
之外的任何值都有toString()
方法
- 数字转字符串:
Number
的toString()
的方法可以设置基数,表示转换结果的进制:1 2 3 4 5
| var n = 17 binary_string = n.toString() binary_string = n.toString(2) octal_string = "0" + n.toString(8) hex_string = "0x" + n.toString(16)
|
toFixed()
, toExponential()
和toPrecision()
,用来控制输出的小数点位置和有效位数:1 2 3 4 5 6 7 8 9
| var n = 123456.789 n.toFixed(0) n.toFixed(2) n.toFixed(5) n.toExponential(1) n.toExponential(3) n.toPrecision(4) n.toPrecision(7) n.toPrecision(10)
|
- 字符串转数字:
parseInt
和parseFloat
(这两个函数都会跳过任意数量的前置空格,尽可能解析更多的数值字符,并忽略后面的内容)
1 2 3 4 5 6 7 8 9 10
| parseInt("3 blind mice") parseFloat(" 3.14 meters") parseInt("-12.34") parseInt("0xFF") parseInt("0xff") parseInt("-0XFF") parseFloat(".1") parseInt("0.1") parseInt(".1") parseFloat("$72.47")
|
其中parseInt()
还可以设置第二个参数,用来表示第一个参数的进制
1 2 3 4 5
| parseInt("11", 2) parseInt("ff", 16) parseInt("zz", 36) parseInt("077", 8) parseInt("077", 10)
|